﻿Namespace SchoolClick.Controllers
    Public Class AnioEscolarController
        Inherits AuthorizeBaseController

#Region "METODOS PARA ""NUEVO AÑO ESCOLAR"""
        <ConstructSubMenu()> _
        <Authorize(Roles:="ERA")> _
        Public Function New_AnioE() As ActionResult
            Return View()
        End Function

        <HttpGet()> _
        <Authorize(Roles:="ERA")> _
        <JFHandleExceptionMessage(Order:=1)> _
        Public Function _IsPossibleNewYear() As ActionResult
            Dim db As New SchoolClickDAL
            'Comprobamos si el último año escolar se encuentra activo o no
            If db.IAñoEscolar.IsEdit Then
                Dim infoAño = db.IAñoEscolar.GetInfoAñoEscolar
                ViewBag.Year = CInt(db.IAñoEscolar.GetNextYear) - 1
                Return PartialView("_edit_año_escolar", New ANIO_ESCOLAR() With {.FECHA_INICIO = infoAño.F_INICIO,
                                                                                 .FECHA_FINAL = infoAño.F_FINAL})
            End If

            'Ahora comprobamos si se puede crear el nuevo año escolar o no
            If db.IAñoEscolar.IsCrearAñoEscolar Then
                ViewBag.Year = db.IAñoEscolar.GetNextYear
                Return PartialView("_new_año_escolar")
            End If


            Return PartialView("_NotEnabledEdiAñoEscolar")
        End Function

        <HttpPost()> _
        <JFValidarModel()> _
        <Authorize(Roles:="ERA")> _
        <JFHandleExceptionMessage(Order:=1)> _
        Public Function _create_anio_escolar(model As ANIO_ESCOLAR) As JsonResult
            Dim db As New SchoolClickDAL
            db.IAñoEscolar.CrearNuevoAñoEscolar(model.FECHA_INICIO, model.FECHA_FINAL)
            Return Json(New With {.success = True,
                                  .notify = New JFNotifySystemMessage(String.Format("El nuevo año escolar {0} se ha creado correctamente en el sistema.", CInt(db.IAñoEscolar.GetNextYear) - 1),
                                                                       titulo:="¡Se creó correctamente!",
                                                                       permanente:=False,
                                                                       icono:=JFNotifySystemIcon.NewDoc,
                                                                       tiempo:=10000)})
        End Function

        <HttpPost()> _
        <JFValidarModel()> _
        <Authorize(Roles:="ERA")> _
        <JFHandleExceptionMessage(Order:=1)> _
        Public Function _edit_anio_escolar(model As ANIO_ESCOLAR) As JsonResult
            Dim db As New SchoolClickDAL
            db.IAñoEscolar.UpdateAñoEscolar(model.FECHA_INICIO, model.FECHA_FINAL)
            Return Json(New With {.success = True,
                                  .notify = New JFNotifySystemMessage(String.Format("El año escolar {0} se actualizó correctamente en el sistema.", CInt(db.IAñoEscolar.GetNextYear) - 1),
                                                                       titulo:="¡Se actualizó correctamente!",
                                                                       permanente:=False,
                                                                       icono:=JFNotifySystemIcon.Update,
                                                                       tiempo:=10000)})
        End Function
#End Region

#Region "METODOS DE ""PROFESORES - NUEVO AÑO ESCOLAR"""
        <ConstructSubMenu()> _
        <Authorize(Roles:="ERA")> _
        Public Function Work_Profesores() As ActionResult
            Return View()
        End Function

        <HttpGet()> _
        <Authorize(Roles:="ERA")> _
        <JFHandleExceptionMessage(Order:=1)> _
        Public Function _get_WorkProfesores() As ActionResult
            Dim db As New SchoolClickDAL
            'Comprobamos si el año esta activo para editar o no
            If db.IAñoEscolar.IsEdit Then
                ViewBag.Year = db.IAñoEscolar.GetYearEdit
                Return PartialView("_definir_profesores_añoescolar")
            End If

            Return PartialView("_NotEnabledEdiAñoEscolar")
        End Function

        <HttpPost()> _
        <Authorize(Roles:="ERA")> _
        Public Function _get_profesores_activos(request As JqGridRequest) As JsonResult
            Dim db As New SchoolClickDAL

            'Preparamos los datos que vamos a enviar
            Dim datos As IEnumerable(Of V_PROFESORES) = db.IProfesores.GetActivos() _
                                                                      .OrderBy(Function(p) p.NOMBRE_COMPLETO) _
                                                                      .Skip((request.PageIndex) * request.RecordsCount) _
                                                                      .Take(request.RecordsCount),
                total = db.IProfesores.GetActivos.Count,
                response As New JqGridResponse With {
                    .TotalPagesCount = Integer.Parse(Math.Ceiling(CDec(total) / CDec(request.RecordsCount))),
                    .PageIndex = request.PageIndex,
                    .TotalRecordsCount = total
                }

            'Preparamos la salida de los datos en formato del modelo del jqGrid
            response.Records.AddRange(datos.Select(Function(p) New JqGridRecord(Of jqGrid.PROFESORES_AÑOESCOLAR)(p.ID_USUARIO,
                                                                New jqGrid.PROFESORES_AÑOESCOLAR With {
                                                                        .ID = p.ID_USUARIO,
                                                                        .Nombre = p.NOMBRE_COMPLETO,
                                                                        .DUI = p.DUI,
                                                                        .Correo = p.CORREO_ELECTRONICO,
                                                                        .Telefono = p.TELEFONO
                                                                    })))
            Return New JqGridJsonResult() With {.Data = response}
        End Function

        <HttpPost()> _
        <Authorize(Roles:="ERA")> _
        Public Function _desactivar_Profesor(id As String) As JsonResult
            'Debemos de partir cada uno de los ID que se han recibido y enviarlos al servidor para desactivarlos
            Dim sID As IEnumerable(Of String) = id.Split(","c),
                db As New SchoolClickDAL
            Try
                'Recorremos cada uno de los profesores y los desactivamos del sistema
                For Each profe In sID
                    db.IProfesores.Desactivar(profe)
                Next
                Return Json(True)
            Catch ex As Exception
                Return Json(False)
            End Try
        End Function

        <HttpGet()> _
        <Authorize(Roles:="ERA")> _
        <JFHandleExceptionMessage(Order:=1)> _
        Public Function _get_CrearProfesor() As ActionResult
            Return PartialView()
        End Function

        <HttpPost()> _
        <JFValidarModel()> _
        <Authorize(Roles:="ERA")> _
        <JFHandleExceptionMessage(Order:=1)> _
        Public Function _save_crearProfesor(model As InfoProfesor) As JsonResult
            Dim db As New SchoolClickDAL
            db.IProfesores.CrearProfesor(model)
            EmailServices.SendProfesorAccount(model, Me)
            Return Json(New With {.success = True,
                                  .notify = New JFNotifySystemMessage("El profesor se ha creado correctamente en el sistema. Además, se le ha enviado al correo electrónico una notificación con su nombre de usuario y contraseña para que pueda acceder al sistema.",
                                                                       titulo:="¡Se creó correctamente!",
                                                                       permanente:=True,
                                                                       icono:=JFNotifySystemIcon.Send)})
        End Function

        <HttpGet()> _
        <Authorize(Roles:="ERA")> _
        <JFHandleExceptionMessage(Order:=1)> _
        Public Function _get_ListProfesoresDesactivados() As ActionResult
            Return PartialView()
        End Function

        <HttpPost()> _
        <Authorize(Roles:="ERA")> _
        Public Function _get_profesores_desactivados(request As JqGridRequest) As JsonResult
            Dim db As New SchoolClickDAL

            'Preparamos los datos que vamos a enviar
            Dim datos As IEnumerable(Of V_PROFESORES) = db.IProfesores.GetDesactivados _
                                                                      .OrderBy(Function(p) p.NOMBRE_COMPLETO) _
                                                                      .Skip((request.PageIndex) * request.RecordsCount) _
                                                                      .Take(request.RecordsCount),
                total = db.IProfesores.GetDesactivados.Count,
                response As New JqGridResponse With {
                    .TotalPagesCount = Integer.Parse(Math.Ceiling(CDec(total) / CDec(request.RecordsCount))),
                    .PageIndex = request.PageIndex,
                    .TotalRecordsCount = total
                }

            'Preparamos la salida de los datos en formato del modelo del jqGrid
            response.Records.AddRange(datos.Select(Function(p) New JqGridRecord(Of jqGrid.PROFESOR_DESACTIVADO)(p.ID_USUARIO,
                                                                New jqGrid.PROFESOR_DESACTIVADO With {
                                                                        .ID = p.ID_USUARIO,
                                                                        .Nombre = p.NOMBRE_COMPLETO
                                                                    })))
            Return New JqGridJsonResult() With {.Data = response}
        End Function

        <HttpPost()> _
        <Authorize(Roles:="ERA")> _
        Public Function _reactivar_profesores(id As String) As JsonResult
            'Debemos de partir cada uno de los ID que se han recibido y enviarlos al servidor para desactivarlos
            Dim sID As IEnumerable(Of String) = id.Split(","c),
                db As New SchoolClickDAL

            'Recorremos cada uno de los profesores y los desactivamos del sistema
            For Each profe In sID
                db.IProfesores.Reactivar(profe)
            Next
            Return Json(New With {.success = True,
                                  .notify = New JFNotifySystemMessage("Los profesores seleccionados se reactivaron correctamente en el sistema. Ahora formarán parte del año escolar.",
                                                                   titulo:="¡Se reactivaron correctamente!",
                                                                   permanente:=True,
                                                                   icono:=JFNotifySystemIcon.Update)})
        End Function
#End Region

#Region "METODOS PARA - MATERIAS DE LOS GRUPOS DE GRADO"
        <ConstructSubMenu()> _
        <Authorize(Roles:="ERA")> _
        Public Function Materias_GG() As ActionResult
            Return View()
        End Function

        <HttpGet()> _
        <Authorize(Roles:="ERA")> _
        <JFHandleExceptionMessage(Order:=1)> _
        Public Function _get_MateriasGG() As ActionResult
            Dim db As New SchoolClickDAL
            'Comprobamos si el año esta activo para editar o no
            If db.IAñoEscolar.IsEdit Then
                ViewBag.Year = db.IAñoEscolar.GetYearEdit
                Return PartialView("_definir_materias_gg")
            End If

            Return PartialView("_NotEnabledEdiAñoEscolar")
        End Function

        <HttpPost()> _
        <JFHandleExceptionMessageAttribute(Order:=1)> _
        Function _getGrados_AJAX() As JsonResult
            Dim db As New SchoolClickDAL

            'Recuperamos los grados disponibles para la matricula
            Dim list = db.IGrados.GetAll.OrderByDescending(Function(g) g.ESPECIALIDAD) _
                                        .ThenBy(Function(g) g.GRADO) _
                                        .Select(Function(gd) New SelectListItem With {.Text = gd.TITULO,
                                                                                      .Value = String.Format("{0}-{1}", gd.GRADO, gd.ESPECIALIDAD)
                                                                                     }).ToArray
            Return Json(New JFComboboxToJSON(list), JsonRequestBehavior.AllowGet)
        End Function

        <HttpPost()> _
        <Authorize(Roles:="ERA")> _
        Public Function _get_materias_newae(Grado As String, Year As String, request As JqGridRequest) As JsonResult
            Dim db As New SchoolClickDAL

            'Preparamos los datos que vamos a enviar
            Dim datos As IEnumerable(Of V_MATERIAS) = db.IGrados.GetMaterias(Grado, Year) _
                                                                .Skip((Request.PageIndex) * Request.RecordsCount) _
                                                                .Take(Request.RecordsCount),
                total = db.IGrados.GetMaterias(Grado, Year).Count,
                response As New JqGridResponse With {
                    .TotalPagesCount = Integer.Parse(Math.Ceiling(CDec(total) / CDec(Request.RecordsCount))),
                    .PageIndex = Request.PageIndex,
                    .TotalRecordsCount = total
                }

            'Preparamos la salida de los datos en formato del modelo del jqGrid
            response.Records.AddRange(datos.Select(Function(p) New JqGridRecord(Of jqGrid.MATERIA)(p.ID_MATERIA,
                                                                New jqGrid.MATERIA With {
                                                                        .ID = p.ID_MATERIA,
                                                                        .Materia = p.MATERIA
                                                                    })))
            Return New JqGridJsonResult() With {.Data = response}
        End Function

        <HttpPost()> _
        <Authorize(Roles:="ERA")> _
        Public Function _delete_materia_grado(id As String, year As String, Grado As String) As JsonResult
            'Debemos de partir cada uno de los ID que se han recibido y enviarlos al servidor para desactivarlos
            Dim sID As IEnumerable(Of String) = id.Split(","c),
                db As New SchoolClickDAL
            Try
                'Recorremos cada uno de los profesores y los desactivamos del sistema
                For Each mat In sID
                    db.IGrados.DeleteMateria(mat, Grado, year)
                Next
                Return Json(True)
            Catch ex As Exception
                Return Json(False)
            End Try
        End Function

        <HttpGet()> _
        <Authorize(Roles:="ERA")> _
        <JFHandleExceptionMessage(Order:=1)> _
        Public Function _get_MateriasNotAssociated(Grado As String, Year As String) As ActionResult
            ViewBag.Grado = Grado
            ViewBag.Year = Year
            Return PartialView()
        End Function

        <HttpPost()> _
        <Authorize(Roles:="ERA")> _
        Public Function _get_materias_not_included_grado(Year As String, Grado As String, request As JqGridRequest) As JsonResult
            Dim db As New SchoolClickDAL

            'Preparamos los datos que vamos a enviar
            Dim datos As IEnumerable(Of MATERIA_EXCLUDE_GRADO) = db.IGrados.GetMateriasExclude(Grado, Year) _
                                                                      .Skip((request.PageIndex) * request.RecordsCount) _
                                                                      .Take(request.RecordsCount),
                total = db.IGrados.GetMateriasExclude(Grado, Year).Count,
                response As New JqGridResponse With {
                    .TotalPagesCount = Integer.Parse(Math.Ceiling(CDec(total) / CDec(request.RecordsCount))),
                    .PageIndex = request.PageIndex,
                    .TotalRecordsCount = total
                }

            'Preparamos la salida de los datos en formato del modelo del jqGrid
            response.Records.AddRange(datos.Select(Function(p) New JqGridRecord(Of jqGrid.MATERIA)(p.ID_MATERIA,
                                                                New jqGrid.MATERIA With {
                                                                        .ID = p.ID_MATERIA,
                                                                        .Materia = p.MATERIA
                                                                    })))
            Return New JqGridJsonResult() With {.Data = response}
        End Function

        <HttpGet()> _
        <Authorize(Roles:="ERA")> _
        <JFHandleExceptionMessage(Order:=1)> _
        Public Function _new_materia_sys() As ActionResult
            Return PartialView()
        End Function

        <HttpPost()> _
        <JFValidarModel()> _
        <Authorize(Roles:="ERA")> _
        <JFHandleExceptionMessage(Order:=1)> _
        Public Function _crear_materia(model As MATERIA_MODEL) As JsonResult
            Dim db As New SchoolClickDAL
            db.IGrados.CrearMateria(model.MATERIA)
            Return Json(New With {.success = True,
                                  .notify = New JFNotifySystemMessage("La materia se creó correctamente en el sistema.",
                                                                       titulo:="¡Se creó correctamente!",
                                                                       permanente:=False,
                                                                       icono:=JFNotifySystemIcon.NewDoc)})
        End Function

        <HttpPost()> _
        <Authorize(Roles:="ERA")> _
        <JFHandleExceptionMessage(Order:=1)> _
        Public Function _asociar_materia_grado(id As String, year As String, grado As String) As JsonResult
            'Debemos de partir cada uno de los ID que se han recibido y enviarlos al servidor para desactivarlos
            Dim sID As IEnumerable(Of String) = id.Split(","c),
                db As New SchoolClickDAL

            'Recorremos cada uno de los profesores y los desactivamos del sistema
            For Each mat In sID
                db.IGrados.AsociarMateria(grado, year, mat)
            Next
            Return Json(New With {.success = True,
                                  .notify = New JFNotifySystemMessage("Se asociaron correctamente las materias seleccionadas al grado actual.",
                                                                   titulo:="¡Se asociaron correctamente!",
                                                                   permanente:=False,
                                                                   icono:=JFNotifySystemIcon.Link)})
        End Function
#End Region

#Region "METODOS PARA CREAR 'GRADOS Y SECCIONES' DEL AÑO ESCOLAR"
        <ConstructSubMenu()> _
        <Authorize(Roles:="ERA")> _
        Public Function Grados_Secciones() As ActionResult
            Return View()
        End Function

        <HttpGet()> _
        <Authorize(Roles:="ERA")> _
        <JFHandleExceptionMessage(Order:=1)> _
        Public Function _get_Grados_Secciones() As ActionResult
            Dim db As New SchoolClickDAL
            'Comprobamos si el año esta activo para editar o no
            If db.IAñoEscolar.IsEdit Then
                ViewBag.Year = db.IAñoEscolar.GetYearEdit
                Return PartialView("_definir_secciones_grados")
            End If

            Return PartialView("_NotEnabledEdiAñoEscolar")
        End Function

        <HttpPost()> _
        <Authorize(Roles:="ERA")> _
        Public Function _get_Info_Alumnos_New_Grado(year As String, gradoesp As String) As ActionResult
            Dim db As New SchoolClickDAL
            'Comprobamos si el año esta activo para editar o no
            If db.IAñoEscolar.IsEdit Then
                ViewBag.Year = year
                ViewBag.GradoEspecialidad = gradoesp
                Return PartialView("_info_alumnos_nuevo_grado", db.IAñoEscolar.GetTotalAlumnosByGrado(year, gradoesp))
            End If

            Throw New ApplicationException("No ha sido posible cargar la información del periodo, ya que no estamos en periodo de creación del nuevo año escolar.")
        End Function

        <HttpGet()> _
        <Authorize(Roles:="ERA")> _
        <JFHandleExceptionMessage(Order:=1)> _
        Public Function _get_Composicion_Secciones_AE(Year As String, GradoEsp As String, Titulo As String, Total As Integer) As ActionResult
            Dim db As New SchoolClickDAL
            'Comprobamos si el año esta activo para editar o no
            If db.IAñoEscolar.IsEdit Then
                ViewBag.Year = Year
                ViewBag.GradoEspecialidad = GradoEsp
                ViewBag.TituloGrado = Titulo
                ViewBag.TotalAlumnos = Total
                Return PartialView("_composicion_grado_seccion_alumno", db.IGrados.GetInfoComposicionSeccion(Year, GradoEsp))
            End If

            Throw New ApplicationException("No ha sido posible cargar la información de la composición del grado, ya que no estamos en periodo de creación del nuevo año escolar.")
        End Function

        <HttpPost()> _
        <JFValidarModel()> _
        <Authorize(Roles:="ERA")> _
        <JFHandleExceptionMessage(Order:=1)> _
        Public Function _save_composicion_grado_ae(year As String, GradoEsp As String, TotalAntiguo As Integer, model As InfoComposicionGradoSeccion) As JsonResult
            Dim db As New SchoolClickDAL
            db.IGrados.SaveComposicionGrado(year, GradoEsp, TotalAntiguo, model)
            Return Json(New With {.success = True,
                                  .notify = New JFNotifySystemMessage("Se ha guardado correctamente la composición del grado para el nuevo año escolar que se esta creando.",
                                                                   titulo:="¡Se guardó correctamente!",
                                                                   permanente:=False,
                                                                   icono:=JFNotifySystemIcon.Update)})
        End Function

        <HttpPost()> _
        <Authorize(Roles:="ERA")> _
        <JFHandleExceptionMessage(Order:=1)> _
        Public Function _crear_all_secciones_ae(year As String) As JsonResult
            Dim db As New SchoolClickDAL
            db.IGrados.CrearTodasSecciones(year)
            Return Json(New With {.success = True,
                                  .notify = New JFNotifySystemMessage(String.Format("Se han creado correctamente todas las secciones para todos los grados del nuevo año escolar {0}.", year),
                                                                   titulo:="¡Se crearon correctamente!",
                                                                   permanente:=False,
                                                                   icono:=JFNotifySystemIcon.Update)})
        End Function
#End Region

#Region "METODOS PARA 'ASIGNAR ALUMNOS EN SECCION'"
        <ConstructSubMenu()> _
        <Authorize(Roles:="ERA")> _
        Public Function Asignacion_Alumnos_Grados() As ActionResult
            Return View()
        End Function

        <HttpGet()> _
        <Authorize(Roles:="ERA")> _
        <JFHandleExceptionMessage(Order:=1)> _
        Public Function _get_Asignacion_Alumnos_AE() As ActionResult
            Dim db As New SchoolClickDAL
            'Comprobamos si el año esta activo para editar o no
            If db.IAñoEscolar.IsEdit Then
                Dim añoEdit = db.IAñoEscolar.GetYearEdit
                'Verificamos que se hayan creado las secciones
                If Not db.IGrados.IsCreateSecciones(añoEdit) Then _
                    Throw New ApplicationException("No se puede cargar esta página debido a que todavía no se han creado las secciones en el sistema. Primero deberá definir la cantidad de alumnos como la cantidad de secciones que tendrá cada grado para poder empezar con la asignación de alumnos.")

                ViewBag.Year = añoEdit

                'Ahora debemos verificar si ya se importaron los alumnos de Nuevo Ingreso al sistema, de lo contrario esto sera el primer paso
                If Not db.IGrados.IsImportAlumnosNuevoIngreso(añoEdit) Then
                    ViewBag.ResumenImport = db.IAñoEscolar.GetResumenImportNuevoIngreso(añoEdit) _
                                                          .OrderByDescending(Function(g) g.ESPECIALIDAD) _
                                                          .ThenBy(Function(g) g.GRADO)
                    Return PartialView("_importar_alumnos_nuevo_ingreso_ae")
                End If

                'Verificamos si los alumnos todavia no han sido asignados en sus secciones
                If Not db.IGrados.IsAlumnosAsignadosSeccion(añoEdit) Then _
                    Return PartialView("_asignar_alumno_seccion_ae")


                Return PartialView("_view_alumnos_seccion")
            End If

            Return PartialView("_NotEnabledEdiAñoEscolar")
        End Function

        <HttpPost()> _
        <Authorize(Roles:="ERA")> _
        <JFHandleExceptionMessage(Order:=1)> _
        Public Function _importar_all_alumnos_nuevo_ingreso_schoolclick(year As String) As JsonResult
            Dim db As New SchoolClickDAL
            db.IAñoEscolar.ImportAlumnosNuevoIngreso(year.EncodeHTML)
            Return Json(New With {.success = True,
                                  .notify = New JFNotifySystemMessage(String.Format("Todos los alumnos de nuevo ingreso para el año escolar {0} se importaron correctamente en el sistema.", year),
                                                                   titulo:="¡Se importaron correctamente!",
                                                                   permanente:=False,
                                                                   icono:=JFNotifySystemIcon.Import)})
        End Function

        <HttpPost()> _
        <Authorize(Roles:="ERA")> _
        <JFHandleExceptionMessage(Order:=1)> _
        Public Function _aplicar_metodo_asignacion_alumnos_grados(year As String, metodo As Integer) As JsonResult
            Dim db As New SchoolClickDAL
            db.IAñoEscolar.Metodo1_AsignarAlumnosASecion(year)
            Return Json(New With {.success = True,
                                  .notify = New JFNotifySystemMessage(String.Format("Todos los alumnos del nuevo año escolar {0} se asociaron correctamente en el sistema a cada uno de los grados y en su sección correspondiente.", year),
                                                                   titulo:="¡Se asociaron correctamente!",
                                                                   permanente:=False,
                                                                   icono:=JFNotifySystemIcon.Link)})
        End Function

        <HttpPost()> _
        <JFHandleExceptionMessageAttribute(Order:=1)> _
        Function _getGradosAndSecciones_AJAX(year As String) As JsonResult
            Dim db As New SchoolClickDAL

            'Recuperamos los grados disponibles para la matricula
            Dim list = db.IGrados.GetGradosAndSecciones(year.EncodeHTML).OrderByDescending(Function(g) g.ESPECIALIDAD) _
                                                                        .ThenBy(Function(g) g.GRADO) _
                                                                        .Select(Function(gd) New SelectListItem With {
                                                                                    .Text = gd.TITULO_COMPLETE,
                                                                                    .Value = gd.ID_GRADO
                                                                                }).ToArray
            Return Json(New JFComboboxToJSON(list), JsonRequestBehavior.AllowGet)
        End Function

        <HttpPost()> _
       <Authorize(Roles:="ERA")> _
        Public Function _get_alumnos_seccion_newae(Grado As String, Year As String, request As JqGridRequest) As JsonResult
            Dim db As New SchoolClickDAL

            'Preparamos los datos que vamos a enviar
            Dim datos As IEnumerable(Of VIEW_ALL_GRADOS_ALUMNOS) = db.IGrados.GetAlumnosByIDGrado(Year, Grado) _
                                                                .Skip((request.PageIndex) * request.RecordsCount) _
                                                                .Take(request.RecordsCount) _
                                                                .OrderBy(Function(g) g.APELLIDOS),
                total = db.IGrados.GetAlumnosByIDGrado(Year, Grado).Count,
                response As New JqGridResponse With {
                    .TotalPagesCount = Integer.Parse(Math.Ceiling(CDec(total) / CDec(request.RecordsCount))),
                    .PageIndex = request.PageIndex,
                    .TotalRecordsCount = total
                }

            'Preparamos la salida de los datos en formato del modelo del jqGrid
            response.Records.AddRange(datos.Select(Function(p) New JqGridRecord(Of jqGrid.ALUMNO_INFO_IN_SECCION)(p.ID_ALUMNO,
                                                                New jqGrid.ALUMNO_INFO_IN_SECCION With {
                                                                        .NIE = p.NIE,
                                                                        .Usuario = p.ID_ALUMNO,
                                                                        .Nombres = p.NOMBRES,
                                                                        .Apellidos = p.APELLIDOS,
                                                                        .IsMateriaSegunda = p.ISMATERIA_SEGUNDA,
                                                                        .NameMateriaSegunda = p.MATERIA
                                                                    })))
            Return New JqGridJsonResult() With {.Data = response}
        End Function
#End Region

#Region "Metodo para 'ASIGNAR PROFESOR A MATERIA'"
        <ConstructSubMenu()> _
        <Authorize(Roles:="ERA")> _
        Public Function Asignar_PRF_MAT() As ActionResult
            Return View()
        End Function

        <HttpGet()> _
        <Authorize(Roles:="ERA")> _
        <JFHandleExceptionMessage(Order:=1)> _
        Public Function _get_Asignar_Profesor_Materia_AE() As ActionResult
            Dim db As New SchoolClickDAL
            'Comprobamos si el año esta activo para editar o no
            If db.IAñoEscolar.IsEdit Then
                Dim añoEdit = db.IAñoEscolar.GetYearEdit
                ViewBag.Year = añoEdit

                'Verificamos que se hayan creado las secciones
                If Not db.IGrados.IsCreateSecciones(añoEdit) Then _
                    Throw New ApplicationException("No se puede cargar esta página debido a que todavía no se han creado las secciones en el sistema. Primero deberá definir la cantidad de alumnos como la cantidad de secciones que tendrá cada grado.")

                Return PartialView("_definir_profesor_imparte_materia")
            End If

            Return PartialView("_NotEnabledEdiAñoEscolar")
        End Function

        <HttpPost()> _
        <Authorize(Roles:="ERA")> _
        Public Function _get_materias_by_idgrado_ae(Grado As String, Year As String, request As JqGridRequest) As JsonResult
            Dim db As New SchoolClickDAL

            'Preparamos los datos que vamos a enviar
            Dim datos As IEnumerable(Of V_GRADOS_MATERIA_PROF_IMPARTE) = db.IGrados.GetMateriasAndProfesor(Year, Grado) _
                                                                                   .Skip((request.PageIndex) * request.RecordsCount) _
                                                                                   .Take(request.RecordsCount),
                total = db.IGrados.GetMateriasAndProfesor(Year, Grado).Count,
                response As New JqGridResponse With {
                    .TotalPagesCount = Integer.Parse(Math.Ceiling(CDec(total) / CDec(request.RecordsCount))),
                    .PageIndex = request.PageIndex,
                    .TotalRecordsCount = total
                }

            'Preparamos la salida de los datos en formato del modelo del jqGrid
            response.Records.AddRange(datos.Select(Function(p) New JqGridRecord(Of jqGrid.DEF_PROFESOR_IMPARTE_MATERIA)(p.ID_MATERIA,
                                                                New jqGrid.DEF_PROFESOR_IMPARTE_MATERIA With {
                                                                        .ID = p.ID_MATERIA,
                                                                        .Materia = p.MATERIA,
                                                                        .Profesor = p.PROFESOR
                                                                    })))
            Return New JqGridJsonResult() With {.Data = response}
        End Function

        <HttpGet()> _
        <OutputCache(Duration:=10000)> _
        <JFHandleExceptionMessageAttribute(Order:=1)> _
        Function _get_selectlist_profesores_activos() As JsonResult
            Dim db As New SchoolClickDAL

            'Recuperamos los grados disponibles para la matricula
            Dim list = db.IProfesores.GetActivos.OrderBy(Function(g) g.NOMBRE_COMPLETO) _
                                                .Select(Function(gd) New SelectListItem With {
                                                            .Text = gd.NOMBRE_COMPLETO,
                                                            .Value = gd.ID_USUARIO
                                                        }).ToArray()
            Return Json(New JFComboboxToJSON(list), JsonRequestBehavior.AllowGet)
        End Function

        <HttpPost()> _
        <Authorize(Roles:="ERA")> _
        Public Function _asignar_profesor_materia_gradoseccion(id As String, year As String, IDGrado As Integer, Profesor As String) As JsonResult
            Dim db As New SchoolClickDAL
            Try
                db.IProfesores.DefinirMateriaAImpartir(IDGrado, Profesor, id)
                Return Json(True)
            Catch ex As Exception
                Return Json(False)
            End Try
        End Function
#End Region

#Region "METODOS PARA 'RESUMEN GRAL DE LA CONFIGURACION DEL NUEVO AÑO ESCOLAR'"
        <ConstructSubMenu()> _
        <Authorize(Roles:="ERA")> _
        Public Function ResumenGeneralNewAE() As ActionResult
            Return View()
        End Function

        <HttpGet()> _
        <Authorize(Roles:="ERA")> _
        <JFHandleExceptionMessage(Order:=1)> _
        Public Function _get_resumen_gral_new_ae() As ActionResult
            Dim db As New SchoolClickDAL
            'Comprobamos si el año esta activo para editar o no
            If db.IAñoEscolar.IsEdit Then
                ViewBag.Year = db.IAñoEscolar.GetYearEdit
                ViewBag.InfoFechas = db.IAñoEscolar.GetInfoAñoEscolar
                ViewBag.InfoProfesores = db.IProfesores.GetActivos
                ViewBag.InfoAlumnosInscritos = db.IGrados.GetAlumnosInscritosInYear(ViewBag.Year) _
                                                         .OrderByDescending(Function(g) g.ESPECIALIDAD) _
                                                         .ThenBy(Function(g) g.GRADO)
                Return PartialView("_resumen_general_nuevo_ae")
            End If

            Return PartialView("_NotEnabledEdiAñoEscolar")
        End Function

        <HttpPost()> _
        <Authorize(Roles:="ERA")> _
        <JFHandleExceptionMessage(Order:=1)> _
        Public Function _finish_process_new_anio_escolar() As JsonResult
            Dim db As New SchoolClickDAL
            db.IAñoEscolar.CloseEditNewAnioEscolar()
            Return Json(New With {.success = True,
                                  .notify = New JFNotifySystemMessage("El nuevo año escolar se configuro correctamente en el sistema; Por lo tanto, el sistema se encuentra listo para iniciar el año escolar con cada uno de sus periodos.",
                                                                   titulo:="¡Se cerró correctamente!",
                                                                   permanente:=False,
                                                                   icono:=JFNotifySystemIcon.Update)})
        End Function
#End Region
    End Class
End Namespace
